/*
 * action 规则
 *   【0-1】单多表示：多单位 - 10   单单位 - 20
 *   【2-3】动作：打开/查看 - 10   关闭/返回 - 20
 *   【4-5】模块：单单位首页 - 01
 *               高危信号 - 02 
 *               重大问题 - 03
 *               安全指数 - 04
 *               设备一张图 - 05
 *               呼叫中心 - 06
 *               接处警 - 07
 *               日常巡检 - 08
 *               隐患整改 - 09
 *               消防供水 - 10
 *               电气火灾 - 11
 *               消防维保 - 12
 *   【6-8】子模块指令：例如 拨打电话 001
*/

import markTypeList from './markType'

// 基础命令
const BASECOMMAND = {
    // 通用指令
    currency: [{
        authority: 'all', // 用户权限
        command: '关闭系统', // 指令
        action: 100000, // 执行动作
        result: '系统已关闭'
    },{
        authority: 'all', // 用户权限
        command: '刷新系统/大屏', // 指令
        action: 100001, // 执行动作
        result: '系统已刷新'
    }, {
        authority: 'all', // 用户权限
        command: '关闭消防/语音/语义识别助手', // 指令
        action: 100100, // 执行动作
        result: '谢谢使用，再见！'
    }, {
        authority: 'all', // 用户权限
        command: '打开/展开工具箱', // 指令
        action: 100200, // 执行动作
        result: '已为您打开工具箱'
    }, {
        authority: 'all', // 用户权限
        command: '关闭工具箱', // 指令
        action: 100201, // 执行动作
        result: '已为您关闭工具箱'
    }, {
        authority: 'all', // 用户权限
        command: '打开/展开系统设置', // 指令
        action: 100300, // 执行动作
        result: '已为您打开系统设置'
    }, {
        authority: 'all', // 用户权限
        command: '关闭系统设置', // 指令
        action: 100301, // 执行动作
        result: '已为您关闭系统设置'
    }, {
        authority: 'all', // 用户权限
        command: '切换地图主题', // 指令
        action: 100207, // 执行动作
        result: '已为您切换地图主题'
    }, {
        authority: 'all', // 用户权限
        command: '打开/返回首页', // 指令
        action: 100400, // 执行动作
        result: '已为您打开首页'
    }, {
        authority: 'all', // 用户权限
        command: '打开/展开呼叫中心', // 指令
        action: 101000, // 执行动作
        result: '已为您打开呼叫中心'
    }, {
        authority: 'all', // 用户权限
        command: '关闭呼叫中心', // 指令
        action: 101001, // 执行动作
        result: '已为您关闭呼叫中心'
    }, {
        authority: 'all', // 用户权限
        command: '打开/查看接处警详情', // 指令
        action: 101100, // 执行动作
        result: '已为您打开接处警详情'
    }, {
        authority: 'all', // 用户权限
        command: '关闭接处警详情', // 指令
        action: 101101, // 执行动作
        result: '已为您关闭接处警详情'
    }, {
        authority: 'all', // 用户权限
        command: '打开/查看日常巡检详情', // 指令
        action: 101200, // 执行动作
        result: '已为您打开日常巡检详情'
    }, {
        authority: 'all', // 用户权限
        command: '关闭日常巡检详情', // 指令
        action: 101201, // 执行动作
        result: '已为您关闭日常巡检详情'
    }, {
        authority: 'all', // 用户权限
        command: '打开/查看隐患整改详情', // 指令
        action: 101300, // 执行动作
        result: '已为您打开隐患整改详情'
    }, {
        authority: 'all', // 用户权限
        command: '关闭隐患整改详情', // 指令
        action: 101301, // 执行动作
        result: '已为您关闭隐患整改详情'
    }, {
        authority: 'all', // 用户权限
        command: '打开/查看消防维保详情', // 指令
        action: 101400, // 执行动作
        result: '已为您打开消防维保详情'
    }, {
        authority: 'all', // 用户权限
        command: '关闭消防维保详情', // 指令
        action: 101401, // 执行动作
        result: '已为您关闭消防维保详情'
    }, {
        authority: 'all', // 用户权限
        command: '打开/查看设备一张图', // 指令
        action: 100600, // 执行动作
        result: '已为您打开设备一张图'
    }, {
        authority: 'all', // 用户权限
        command: '关闭设备一张图', // 指令
        action: 100601, // 执行动作
        result: '已为您关闭设备一张图'
    }, {
        authority: 'all', // 用户权限
        command: '打开/查看设备清单', // 指令
        action: 101500, // 执行动作
        result: '已为您打开设备清单'
    }, {
        authority: 'all', // 用户权限
        command: '打开/查看消防供水', // 指令
        action: 101500, // 执行动作
        result: '已为您打开消防供水设备清单',
        parames: { systemId: 131 }
    }, {
        authority: 'all', // 用户权限
        command: '打开/查看电气火灾', // 指令
        action: 101500, // 执行动作
        result: '已为您打开电气火灾设备清单',
        parames: { systemId: 132 }
    }, {
        authority: 'all', // 用户权限
        command: '打开/查看消防供水', // 指令
        action: 101500, // 执行动作
        result: '已为您打开消防供水设备清单',
        parames: { systemId: 131 }
    }, {
        authority: 'all', // 用户权限
        command: '打开/查看报警的设备', // 指令
        action: 101500, // 执行动作
        result: '已为您打开报警的设备清单',
        parames: { status: 10 } // 报警类型 -1：所有 0：正常 10：报警 20：故障 30：屏蔽 40：联动
    }, {
        authority: 'all', // 用户权限
        command: '打开/查看故障的设备', // 指令
        action: 101500, // 执行动作
        result: '已为您打开故障的设备清单',
        parames: { status: 20 }
    }, {
        authority: 'all', // 用户权限
        command: '打开/查看屏蔽的设备', // 指令
        action: 101500, // 执行动作
        result: '已为您打开屏蔽的设备清单',
        parames: { status: 30 }
    }, {
        authority: 'all', // 用户权限
        command: '打开/查看联动的设备', // 指令
        action: 101500, // 执行动作
        result: '已为您打开联动的设备清单',
        parames: { status: 40 }
    }, {
        authority: 'all', // 用户权限
        command: '关闭设备清单', // 指令
        action: 101501, // 执行动作
        result: '已为您关闭设备清单'
    }],
    // 多单位指令
    multiUnit: [{
        authority: 'multiUnit', // 用户权限
        command: '展开/查看接入单位', // 指令
        action: 101700, // 执行动作
        result: '已为您展示接入单位'
    }, {
        authority: 'multiUnit', // 用户权限
        command: '关闭接入单位', // 指令
        action: 101701, // 执行动作
        result: '已为您关闭接入单位'
    }, {
        authority: 'multiUnit', // 用户权限
        command: '展开/查看报警单位', // 指令
        action: 101800, // 执行动作
        result: '已为您展示报警单位'
    }, {
        authority: 'multiUnit', // 用户权限
        command: '关闭报警单位', // 指令
        action: 101801, // 执行动作
        result: '已为您关闭报警单位'
    }, {
        authority: 'multiUnit', // 用户权限
        command: '打开/查看高危信号详情', // 指令
        action: 100700, // 执行动作
        result: '已为您打开高危信号详情'
    }, {
        authority: 'multiUnit', // 用户权限
        command: '打开/查看实时高危信号详情', // 指令
        action: 100700, // 执行动作
        result: '已为您打开实时高危信号详情',
        parames: { showType: 1 }
    }, {
        authority: 'multiUnit', // 用户权限
        command: '打开/查看历史高危信号详情', // 指令
        action: 100700, // 执行动作
        result: '已为您打开历史高危信号详情',
        parames: { showType: 2 }
    }, {
        authority: 'multiUnit', // 用户权限
        command: '关闭高危信号详情', // 指令
        action: 100701, // 执行动作
        result: '已为您关闭高危信号详情'
    }, {
        authority: 'multiUnit', // 用户权限
        command: '打开/查看重大问题详情', // 指令
        action: 100800, // 执行动作
        result: '已为您打开重大问题详情'
    }, {
        authority: 'multiUnit', // 用户权限
        command: '打开/查看实时重大问题详情', // 指令
        action: 100800, // 执行动作
        result: '已为您打开实时重大问题详情',
        parames: { showType: 1 }
    }, {
        authority: 'multiUnit', // 用户权限
        command: '打开/查看历史重大问题详情', // 指令
        action: 100800, // 执行动作
        result: '已为您打开历史重大问题详情',
        parames: { showType: 2 }
    }, {
        authority: 'multiUnit', // 用户权限
        command: '关闭重大问题详情', // 指令
        action: 100801, // 执行动作
        result: '已为您关闭重大问题详情'
    }, {
        authority: 'multiUnit', // 用户权限
        command: '打开/查看消防安全评估', // 指令
        action: 100900, // 执行动作
        result: '已为您打开消防安全评估'
    }, {
        authority: 'multiUnit', // 用户权限
        command: '展开/查看安全指数排名', // 指令
        action: 101900, // 执行动作
        result: '已为您展开安全指数排名'
    }, {
        authority: 'multiUnit', // 用户权限
        command: '关闭/收起安全指数排名', // 指令
        action: 101900, // 执行动作
        result: '已为您收起安全指数排名'
    }],
    singleUnit: [{
        authority: 'singleUnit', // 用户权限
        command: '打开/查看消防安全评估', // 指令
        action: 100900, // 执行动作
        result: '已为您打开消防安全评估'
    }]
}
// 语音库
const LANGUAGEDATA = []

// 聚合组装语音指令库
for (let key in BASECOMMAND) {
    let authorityList = ['currency'] // 默认拥有通用指令权限
    let isMuilUnitUser = topVue.$store.state.userInfo.isMuilUnitUser // 0:单单位用户;1:多单位用户
    // 权限集合设置
    if (isMuilUnitUser) {
        authorityList.push('multiUnit')
    } else {
        authorityList.push('singleUnit')
    }

    if (authorityList.includes(key)) {
        for (let i = 0, len = BASECOMMAND[key].length; i < len; i++) {
            LANGUAGEDATA.push(BASECOMMAND[key][i])
        }
    }
}

let isAddDynamicCmd=false

// 处理器
const PROCESSOR = {
    // 排行榜数
    topNum: 3,
    // 需要处理的语言文字
    text: '',
    // 开始处理
    start(val) {

        // 删掉助词
        val=val.replace(/[啊][额][呀][吧][嗯][哦][诶][呃][唔][哈][咦]/g,'')
        
        // 动态指令
        let dynamicCmd=[]
        let matchedOrg=topVue.$store.state.unitGroup.filter(n=>{ return val.indexOf(n.orgName)>-1 })[0]
        if(matchedOrg){
            dynamicCmd.push({
                authority: 'all', // 用户权限
                command: '打开/进入'+matchedOrg.orgName+'首页', // 指令
                action: 100500, // 执行动作
                result: '已为您打开'+matchedOrg.orgName+'首页',
                orgId:matchedOrg.orgId,
                parames: matchedOrg
            })
            dynamicCmd.push({
                authority: 'multiUnit', // 用户权限
                command: '查看'+matchedOrg.orgName+'的安全指数', // 指令
                action: 100902, // 执行动作
                result: matchedOrg.orgName+'的实时安全指数是'+matchedOrg.safetyScore,
                orgId:matchedOrg.orgId,
                parames: matchedOrg
            })
            dynamicCmd.push({
                authority: 'multiUnit', // 用户权限
                command: '查看'+matchedOrg.orgName+'的消防安全评估', // 指令
                action: 100900, // 执行动作
                result: '已为您打开'+matchedOrg.orgName+'的消防安全评估',
                orgId:matchedOrg.orgId,
                parames: matchedOrg
            })
        }
        if((val.indexOf('打开')>-1||val.indexOf('查看')>-1)&&val.indexOf('一张图')>-1){
            let _val=val.replace('打开','').replace('查看','').replace('一张图','')
            let matchedMarkType=markTypeList.data.filter(n=>{ return n.name.replace('_','').indexOf(_val)>-1||_val.indexOf(n.name.replace('_',''))>-1 })[0]
            if(matchedMarkType){
                dynamicCmd.push({
                    authority: 'multiUnit', // 用户权限
                    command: '打开/查看'+matchedMarkType.name+'一张图', // 指令
                    action: 100602, // 执行动作
                    result: '已为您打开'+matchedMarkType.name.replace('_','')+'一张图',
                    parames: {
                        markType:matchedMarkType.type
                    }
                })
            }
        }
        if(val.indexOf('呼叫')==0){
            dynamicCmd.push({
                authority: 'all', // 用户权限
                command: val, // 指令
                action: 101004, // 执行动作
                result: '正在'+val,
                parames: { userName: val }
            })
        }
        
        let resultList = []; // 匹配的结果集

        this.text = val

        var LANGUAGEDATA_ALL=LANGUAGEDATA.concat(dynamicCmd)

        // 遍历脚本库集合
        for (let i = 0, len = LANGUAGEDATA_ALL.length; i < len; i++) {
            // 计算匹配度得分
            let score = this.getMatchDegree(LANGUAGEDATA_ALL[i].command)
            // 匹配得分大于50
            if (score >= 50) {
                if (resultList.length === this.topNum) {
                    // 是否大于当前排行榜的最后一名
                    if (score > resultList[this.topNum - 1].score) {
                        resultList[this.topNum - 1] = Object.assign({ score: score, speechTxt: val }, LANGUAGEDATA_ALL[i])
                    }
                } else {
                    resultList.push(Object.assign({ score: score, speechTxt: val }, LANGUAGEDATA_ALL[i]))
                }
                // 排序
                resultList = this.resetTop(resultList)
            }
        }

        console.log(JSON.stringify(LANGUAGEDATA_ALL.map(n=>{return n.command})))

        return resultList
    },
    /**
     * 计算匹配度
     * 【参数】：
     *      commandText - 指令文本
     **/
    getMatchDegree(commandText) {
        let text = this.text
        let pairSuccessNum = 0;
        for (var i = 0; i < text.length; i++) {
            let tmp = text.substr(i, 1);
            if (commandText.indexOf(tmp) > -1)
                pairSuccessNum++;
        }
        let rslt = (pairSuccessNum * 100 / text.length).toFixed(2);
        if (rslt > 100) {
            rslt = 100;
        }
        return Number(rslt);
    },
    /**
     * 重新设置排行榜顺序
     **/
    resetTop(arr) {
        let len = arr.length;

        for (let i = 0; i < len; i++) {
            for (let j = 0; j < len - 1 - i; j++) {
                if (arr[j].score < arr[j + 1].score) {        //相邻元素两两对比
                    let obj = arr[j];        //元素交换
                    arr[j] = arr[j + 1];
                    arr[j + 1] = obj;
                }
            }
        }
        return arr;
    }
}

export default PROCESSOR
